Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


Power.h 2947df3349dd3d5e38bfa5124c80fd02ac443bab (2947df33) Text, 20.60 KB

T8b949e// Copyright (C) 2024, Mark Qvist

T8b949e// This program is free software: you can redistribute it and/or modify
T8b949e// it under the terms of the GNU General Public License as published by
T8b949e// the Free Software Foundation, either version 3 of the License, or
T8b949e// (at your option) any later version.

T8b949e// This program is distributed in the hope that it will be useful,
T8b949e// but WITHOUT ANY WARRANTY; without even the implied warranty of
T8b949e// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
T8b949e// GNU General Public License for more details.

T8b949e// You should have received a copy of the GNU General Public License
T8b949e// along with this program. If not, see <https://www.gnu.org/licenses/>.

Tff7b72#Tff7b72if BOARD_MODEL == BOARD_TBEAM || BOARD_MODEL == BOARD_TBEAM_S_V1
Tff7b72#Tff7b72include T8b949e<XPowersLib.h>
Te6edf3XPowersLibInterfaceTff7b72* Te6edf3PMU Tff7b72= Tffa657NULLTb4b4b4;

Tff7b72#Tff7b72ifndef PMU_WIRE_PORT
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_TBEAM_S_V1
Tff7b72#Tff7b72define PMU_WIRE_PORT Wire1
Tff7b72#Tff7b72else
Tff7b72#Tff7b72define PMU_WIRE_PORT Wire
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.14

Tffa657void Td2a8ffdisablePeripheralsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3PMUTb4b4b4) Tb4b4b4{
T8b949e// GNSS RTC PowerVDD
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_VBACKUPTb4b4b4)Tb4b4b4;

T8b949e// LoRa VDD
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO2Tb4b4b4)Tb4b4b4;

T8b949e// GNSS VDD
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO3Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657bool Te6edf3pmuInterruptTb4b4b4;
Tffa657void Td2a8ffsetPmuFlagTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3pmuInterrupt Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1
Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.3
Tff7b72#Tff7b72define BAT_V_CHG 4.48
Tff7b72#Tff7b72define BAT_V_FLOAT 4.33
Tff7b72#Tff7b72define BAT_SAMPLES 5
Tff7b72const Tffa657uint8_t Te6edf3pin_vbat Tff7b72= T79c0ff35Tb4b4b4;
Tffa657float Te6edf3bat_p_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657float Te6edf3bat_v_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_discharging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charged_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Tffa657float Te6edf3bat_delay_v Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3bat_state_change_v Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_T3S3
Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.217
Tff7b72#Tff7b72define BAT_V_CHG 4.48
Tff7b72#Tff7b72define BAT_V_FLOAT 4.33
Tff7b72#Tff7b72define BAT_SAMPLES 5
Tff7b72const Tffa657uint8_t Te6edf3pin_vbat Tff7b72= T79c0ff1Tb4b4b4;
Tffa657float Te6edf3bat_p_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657float Te6edf3bat_v_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_discharging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charged_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Tffa657float Te6edf3bat_delay_v Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3bat_state_change_v Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TDECK
Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.3
Tff7b72#Tff7b72define BAT_V_CHG 4.48
Tff7b72#Tff7b72define BAT_V_FLOAT 4.33
Tff7b72#Tff7b72define BAT_SAMPLES 5
Tff7b72const Tffa657uint8_t Te6edf3pin_vbat Tff7b72= T79c0ff4Tb4b4b4;
Tffa657float Te6edf3bat_p_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657float Te6edf3bat_v_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_discharging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charged_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Tffa657float Te6edf3bat_delay_v Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3bat_state_change_v Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC32_V3
Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.3
Tff7b72#Tff7b72define BAT_V_CHG 4.48
Tff7b72#Tff7b72define BAT_V_FLOAT 4.33
Tff7b72#Tff7b72define BAT_SAMPLES 7
Tff7b72const Tffa657uint8_t Te6edf3pin_vbat Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72const Tffa657uint8_t Te6edf3pin_ctrl Tff7b72= T79c0ff37Tb4b4b4;
Tffa657float Te6edf3bat_p_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657float Te6edf3bat_v_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_discharging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charged_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Tffa657float Te6edf3bat_delay_v Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3bat_state_change_v Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC32_V4
Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.3
Tff7b72#Tff7b72define BAT_V_CHG 4.48
Tff7b72#Tff7b72define BAT_V_FLOAT 4.33
Tff7b72#Tff7b72define BAT_SAMPLES 7
Tff7b72const Tffa657uint8_t Te6edf3pin_vbat Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72const Tffa657uint8_t Te6edf3pin_ctrl Tff7b72= T79c0ff37Tb4b4b4;
Tffa657float Te6edf3bat_p_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657float Te6edf3bat_v_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_discharging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charged_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Tffa657float Te6edf3bat_delay_v Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3bat_state_change_v Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC_T114
Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.165
Tff7b72#Tff7b72define BAT_V_CHG 4.48
Tff7b72#Tff7b72define BAT_V_FLOAT 4.33
Tff7b72#Tff7b72define BAT_SAMPLES 7
Tff7b72const Tffa657uint8_t Te6edf3pin_vbat Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72const Tffa657uint8_t Te6edf3pin_ctrl Tff7b72= T79c0ff6Tb4b4b4;
Tffa657float Te6edf3bat_p_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657float Te6edf3bat_v_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_discharging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charged_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Tffa657float Te6edf3bat_delay_v Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3bat_state_change_v Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TECHO
Tff7b72#Tff7b72define BAT_V_MIN 3.15
Tff7b72#Tff7b72define BAT_V_MAX 4.16
Tff7b72#Tff7b72define BAT_V_CHG 4.48
Tff7b72#Tff7b72define BAT_V_FLOAT 4.33
Tff7b72#Tff7b72define BAT_SAMPLES 7
Tff7b72const Tffa657uint8_t Te6edf3pin_vbat Tff7b72= T79c0ff4Tb4b4b4;
Tffa657float Te6edf3bat_p_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657float Te6edf3bat_v_samplesTb4b4b4[Te6edf3BAT_SAMPLESTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_discharging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charging_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657int Te6edf3bat_charged_samples Tff7b72= T79c0ff0Tb4b4b4;
Tffa657bool Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Tffa657float Te6edf3bat_delay_v Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3bat_state_change_v Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72endif

Tffa657uint32_t Te6edf3last_pmu_update Tff7b72= T79c0ff0Tb4b4b4;
Tffa657uint8_t Te6edf3pmu_target_pps Tff7b72= T79c0ff1Tb4b4b4;
Tffa657int Te6edf3pmu_update_interval Tff7b72= T79c0ff1000Tff7b72/Te6edf3pmu_target_ppsTb4b4b4;
Tffa657uint8_t Te6edf3pmu_rc Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72define PMU_R_INTERVAL 5
Tffa657void Td2a8ffkiss_indicate_batteryTb4b4b4(Tb4b4b4)Tb4b4b4;

Tffa657void Td2a8ffmeasure_batteryTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_TECHO
Te6edf3battery_installed Tff7b72= Tffa657trueTb4b4b4;
Te6edf3battery_indeterminate Tff7b72= Tffa657trueTb4b4b4;

Tff7b72#Tff7b72if BOARD_MODEL == BOARD_HELTEC32_V3
Tffa657float Te6edf3battery_measurement Tff7b72= Tb4b4b4(Tffa657floatTb4b4b4)Tb4b4b4(Te6edf3analogReadTb4b4b4(Te6edf3pin_vbatTb4b4b4)Tb4b4b4) Tff7b72* T79c0ff0.0041Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC32_V4
Tffa657float Te6edf3battery_measurement Tff7b72= Tb4b4b4(Tffa657floatTb4b4b4)Tb4b4b4(Te6edf3analogReadTb4b4b4(Te6edf3pin_vbatTb4b4b4)Tb4b4b4) Tff7b72* T79c0ff0.0041Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_T3S3
Tffa657float Te6edf3battery_measurement Tff7b72= Tb4b4b4(Tffa657floatTb4b4b4)Tb4b4b4(Te6edf3analogReadTb4b4b4(Te6edf3pin_vbatTb4b4b4)Tb4b4b4) Tff7b72/ T79c0ff4095.0Tff7b72*T79c0ff6.7828Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC_T114
Tffa657float Te6edf3battery_measurement Tff7b72= Tb4b4b4(Tffa657floatTb4b4b4)Tb4b4b4(Te6edf3analogReadTb4b4b4(Te6edf3pin_vbatTb4b4b4)Tb4b4b4) Tff7b72* T79c0ff0.017165Tb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TECHO
Tffa657float Te6edf3battery_measurement Tff7b72= Tb4b4b4(Tffa657floatTb4b4b4)Tb4b4b4(Te6edf3analogReadTb4b4b4(Te6edf3pin_vbatTb4b4b4)Tb4b4b4) Tff7b72* T79c0ff0.007067Tb4b4b4;
Tff7b72#Tff7b72else
Tffa657float Te6edf3battery_measurement Tff7b72= Tb4b4b4(Tffa657floatTb4b4b4)Tb4b4b4(Te6edf3analogReadTb4b4b4(Te6edf3pin_vbatTb4b4b4)Tb4b4b4) Tff7b72/ T79c0ff4095.0Tff7b72*T79c0ff7.26Tb4b4b4;
Tff7b72#Tff7b72endif

Te6edf3bat_v_samplesTb4b4b4[Te6edf3bat_samples_countTff7b72%Te6edf3BAT_SAMPLESTb4b4b4] Tff7b72= Te6edf3battery_measurementTb4b4b4;
Te6edf3bat_p_samplesTb4b4b4[Te6edf3bat_samples_countTff7b72%Te6edf3BAT_SAMPLESTb4b4b4] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3battery_voltageTff7b72-Te6edf3BAT_V_MINTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3BAT_V_MAXTff7b72-Te6edf3BAT_V_MINTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff100.0Tb4b4b4;
Te6edf3bat_samples_countTff7b72+Tff7b72+Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3battery_ready Tff7b72&Tff7b72& Te6edf3bat_samples_count Tff7b72>Tff7b72= Te6edf3BAT_SAMPLESTb4b4b4) Tb4b4b4{
Te6edf3battery_ready Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3battery_readyTb4b4b4) Tb4b4b4{

Te6edf3battery_percent Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3bi Tff7b72= T79c0ff0Tb4b4b4; Te6edf3bi Tff7b72< Te6edf3BAT_SAMPLESTb4b4b4; Te6edf3biTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3battery_percent Tff7b72+Tff7b72= Te6edf3bat_p_samplesTb4b4b4[Te6edf3biTb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3battery_percent Tff7b72= Te6edf3battery_percentTff7b72/Te6edf3BAT_SAMPLESTb4b4b4;
Te6edf3battery_voltage Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3bi Tff7b72= T79c0ff0Tb4b4b4; Te6edf3bi Tff7b72< Te6edf3BAT_SAMPLESTb4b4b4; Te6edf3biTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3battery_voltage Tff7b72+Tff7b72= Te6edf3bat_v_samplesTb4b4b4[Te6edf3biTb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3battery_voltage Tff7b72= Te6edf3battery_voltageTff7b72/Te6edf3BAT_SAMPLESTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bat_delay_v Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3bat_delay_v Tff7b72= Te6edf3battery_voltageTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bat_state_change_v Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3bat_state_change_v Tff7b72= Te6edf3battery_voltageTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3battery_percent Tff7b72> T79c0ff100.0Tb4b4b4) Te6edf3battery_percent Tff7b72= T79c0ff100.0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3battery_percent Tff7b72< T79c0ff0.0Tb4b4b4) Te6edf3battery_percent Tff7b72= T79c0ff0.0Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3bat_samples_countTff7b72%Te6edf3BAT_SAMPLES Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tffa657float Te6edf3bat_delay_diff Tff7b72= Te6edf3bat_state_change_vTff7b72-Te6edf3battery_voltageTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bat_delay_diff Tff7b72< T79c0ff0Tb4b4b4) Tb4b4b4{ Te6edf3bat_delay_diff Tff7b72*Tff7b72= T79c0ff-1Tb4b4b4; Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3battery_voltage Tff7b72< Te6edf3bat_delay_v Tff7b72&Tff7b72& Te6edf3battery_voltage Tff7b72< Te6edf3BAT_V_FLOATTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bat_voltage_dropping Tff7b72=Tff7b72= Tffa657falseTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bat_delay_diff Tff7b72> T79c0ff0.008Tb4b4b4) Tb4b4b4{
Te6edf3bat_voltage_dropping Tff7b72= Tffa657trueTb4b4b4;
Te6edf3bat_state_change_v Tff7b72= Te6edf3battery_voltageTb4b4b4;
T8b949e// SerialBT.printf("STATE CHANGE to DISCHARGE at delta=%.3fv. State change v is now %.3fv.\n", bat_delay_diff, bat_state_change_v);
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bat_voltage_dropping Tff7b72=Tff7b72= Tffa657trueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bat_delay_diff Tff7b72> T79c0ff0.01Tb4b4b4) Tb4b4b4{
Te6edf3bat_voltage_dropping Tff7b72= Tffa657falseTb4b4b4;
Te6edf3bat_state_change_v Tff7b72= Te6edf3battery_voltageTb4b4b4;
T8b949e// SerialBT.printf("STATE CHANGE to CHARGE at delta=%.3fv. State change v is now %.3fv.\n", bat_delay_diff, bat_state_change_v);
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3bat_samples_count Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3bat_delay_v Tff7b72= Te6edf3battery_voltageTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3bat_voltage_dropping Tff7b72&Tff7b72& Te6edf3battery_voltage Tff7b72< Te6edf3BAT_V_FLOATTb4b4b4) Tb4b4b4{
Te6edf3battery_state Tff7b72= Te6edf3BATTERY_STATE_DISCHARGINGTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3battery_percent Tff7b72< T79c0ff100.0Tb4b4b4) Tb4b4b4{
Te6edf3battery_state Tff7b72= Te6edf3BATTERY_STATE_CHARGINGTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3battery_state Tff7b72= Te6edf3BATTERY_STATE_CHARGEDTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Tff7b72if Tb4b4b4(Te6edf3bt_state Tff7b72!Tff7b72= Te6edf3BT_STATE_OFFTb4b4b4) Tb4b4b4{ Te6edf3blebasTb4b4b4.Te6edf3writeTb4b4b4(Te6edf3battery_percentTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72#Tff7b72endif

T8b949e// if (bt_state == BT_STATE_CONNECTED) {
T8b949e// SerialBT.printf("Bus voltage %.3fv. Unfiltered %.3fv.", battery_voltage, bat_v_samples[BAT_SAMPLES-1]);
T8b949e// if (bat_voltage_dropping) { SerialBT.printf(" Voltage is dropping. Percentage %.1f%%.", battery_percent); }
T8b949e// else { SerialBT.printf(" Voltage is not dropping. Percentage %.1f%%.", battery_percent); }
T8b949e// if (battery_state == BATTERY_STATE_DISCHARGING) { SerialBT.printf(" Battery discharging. delay_v %.3fv", bat_delay_v); }
T8b949e// if (battery_state == BATTERY_STATE_CHARGING) { SerialBT.printf(" Battery charging. delay_v %.3fv", bat_delay_v); }
T8b949e// if (battery_state == BATTERY_STATE_CHARGED) { SerialBT.print(" Battery is charged."); }
T8b949e// SerialBT.print("\n");
T8b949e// }
Tb4b4b4}

Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TBEAM || BOARD_MODEL == BOARD_TBEAM_S_V1
Tff7b72if Tb4b4b4(Te6edf3PMUTb4b4b4) Tb4b4b4{
Tffa657float Te6edf3discharge_current Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3charge_current Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3ext_voltage Tff7b72= T79c0ff0Tb4b4b4;
Tffa657float Te6edf3ext_current Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3PMUTff7b72-Tff7b72>Te6edf3getChipModelTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3XPOWERS_AXP192Tb4b4b4) Tb4b4b4{
Te6edf3discharge_current Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3XPowersAXP192Tff7b72*Tb4b4b4)Te6edf3PMUTb4b4b4)Tff7b72-Tff7b72>Te6edf3getBattDischargeCurrentTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3charge_current Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3XPowersAXP192Tff7b72*Tb4b4b4)Te6edf3PMUTb4b4b4)Tff7b72-Tff7b72>Te6edf3getBatteryChargeCurrentTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3battery_voltage Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3getBattVoltageTb4b4b4(Tb4b4b4)Tff7b72/T79c0ff1000.0Tb4b4b4;
T8b949e// battery_percent = PMU->getBattPercentage()*1.0;
Te6edf3battery_installed Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3isBatteryConnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3external_power Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3isVbusInTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ext_voltage Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3getVbusVoltageTb4b4b4(Tb4b4b4)Tff7b72/T79c0ff1000.0Tb4b4b4;
Te6edf3ext_current Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3XPowersAXP192Tff7b72*Tb4b4b4)Te6edf3PMUTb4b4b4)Tff7b72-Tff7b72>Te6edf3getVbusCurrentTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3PMUTff7b72-Tff7b72>Te6edf3getChipModelTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3XPOWERS_AXP2101Tb4b4b4) Tb4b4b4{
Te6edf3battery_voltage Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3getBattVoltageTb4b4b4(Tb4b4b4)Tff7b72/T79c0ff1000.0Tb4b4b4;
T8b949e// battery_percent = PMU->getBattPercentage()*1.0;
Te6edf3battery_installed Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3isBatteryConnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3external_power Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3isVbusInTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ext_voltage Tff7b72= Te6edf3PMUTff7b72-Tff7b72>Te6edf3getVbusVoltageTb4b4b4(Tb4b4b4)Tff7b72/T79c0ff1000.0Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3battery_installedTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3PMUTff7b72-Tff7b72>Te6edf3isChargingTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3battery_state Tff7b72= Te6edf3BATTERY_STATE_CHARGINGTb4b4b4;
Te6edf3battery_percent Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3battery_voltageTff7b72-Te6edf3BAT_V_MINTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3BAT_V_MAXTff7b72-Te6edf3BAT_V_MINTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff100.0Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3PMUTff7b72-Tff7b72>Te6edf3isDischargeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3battery_state Tff7b72= Te6edf3BATTERY_STATE_DISCHARGINGTb4b4b4;
Te6edf3battery_percent Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3battery_voltageTff7b72-Te6edf3BAT_V_MINTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3BAT_V_MAXTff7b72-Te6edf3BAT_V_MINTb4b4b4)Tb4b4b4)Tff7b72*T79c0ff100.0Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3battery_state Tff7b72= Te6edf3BATTERY_STATE_CHARGEDTb4b4b4;
Te6edf3battery_percent Tff7b72= T79c0ff100.0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3battery_state Tff7b72= Te6edf3BATTERY_STATE_UNKNOWNTb4b4b4;
Te6edf3battery_percent Tff7b72= T79c0ff0.0Tb4b4b4;
Te6edf3battery_voltage Tff7b72= T79c0ff0.0Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3battery_percent Tff7b72> T79c0ff100.0Tb4b4b4) Te6edf3battery_percent Tff7b72= T79c0ff100.0Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3battery_percent Tff7b72< T79c0ff0.0Tb4b4b4) Te6edf3battery_percent Tff7b72= T79c0ff0.0Tb4b4b4;

Tffa657float Te6edf3charge_watts Tff7b72= Te6edf3battery_voltageTff7b72*Tb4b4b4(Te6edf3charge_currentTff7b72/T79c0ff1000.0Tb4b4b4)Tb4b4b4;
Tffa657float Te6edf3discharge_watts Tff7b72= Te6edf3battery_voltageTff7b72*Tb4b4b4(Te6edf3discharge_currentTff7b72/T79c0ff1000.0Tb4b4b4)Tb4b4b4;
Tffa657float Te6edf3ext_watts Tff7b72= Te6edf3ext_voltageTff7b72*Tb4b4b4(Te6edf3ext_currentTff7b72/T79c0ff1000.0Tb4b4b4)Tb4b4b4;

Te6edf3battery_ready Tff7b72= Tffa657trueTb4b4b4;

T8b949e// if (bt_state == BT_STATE_CONNECTED) {
T8b949e// if (battery_installed) {
T8b949e// if (external_power) {
T8b949e// SerialBT.printf("External power connected, drawing %.2fw, %.1fmA at %.1fV\n", ext_watts, ext_current, ext_voltage);
T8b949e// } else {
T8b949e// SerialBT.println("Running on battery");
T8b949e// }
T8b949e// SerialBT.printf("Battery percentage %.1f%%\n", battery_percent);
T8b949e// SerialBT.printf("Battery voltage %.2fv\n", battery_voltage);
T8b949e// // SerialBT.printf("Temperature %.1f%\n", auxillary_temperature);

T8b949e// if (battery_state == BATTERY_STATE_CHARGING) {
T8b949e// SerialBT.printf("Charging with %.2fw, %.1fmA at %.1fV\n", charge_watts, charge_current, battery_voltage);
T8b949e// } else if (battery_state == BATTERY_STATE_DISCHARGING) {
T8b949e// SerialBT.printf("Discharging at %.2fw, %.1fmA at %.1fV\n", discharge_watts, discharge_current, battery_voltage);
T8b949e// } else if (battery_state == BATTERY_STATE_CHARGED) {
T8b949e// SerialBT.printf("Battery charged\n");
T8b949e// }
T8b949e// } else {
T8b949e// SerialBT.println("No battery installed");
T8b949e// }
T8b949e// SerialBT.println("");
T8b949e// }
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3battery_ready Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif

Tff7b72if Tb4b4b4(Te6edf3battery_readyTb4b4b4) Tb4b4b4{
Te6edf3pmu_rcTff7b72+Tff7b72+Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pmu_rcTff7b72%Te6edf3PMU_R_INTERVAL Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3kiss_indicate_batteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffupdate_pmuTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3last_pmu_update Tff7b72>Tff7b72= Te6edf3pmu_update_intervalTb4b4b4) Tb4b4b4{
Te6edf3measure_batteryTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3last_pmu_update Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657bool Td2a8ffinit_pmuTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_TECHO
Te6edf3pinModeTb4b4b4(Te6edf3pin_vbatTb4b4b4, Te6edf3INPUTTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC32_V3
Te6edf3pinModeTb4b4b4(Te6edf3pin_ctrlTb4b4b4,Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3pin_ctrlTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC32_V4
Te6edf3pinModeTb4b4b4(Te6edf3pin_ctrlTb4b4b4,Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3pin_ctrlTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_HELTEC_T114
Te6edf3pinModeTb4b4b4(Te6edf3pin_ctrlTb4b4b4,Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3pin_ctrlTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tff7b72return Tffa657trueTb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TBEAM
Te6edf3WireTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3I2C_SDATb4b4b4, Te6edf3I2C_SCLTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTb4b4b4) Tb4b4b4{
Te6edf3PMU Tff7b72= Te6edf3new Te6edf3XPowersAXP2101Tb4b4b4(Te6edf3PMU_WIRE_PORTTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTff7b72-Tff7b72>Te6edf3initTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3delete Te6edf3PMUTb4b4b4;
Te6edf3PMU Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTb4b4b4) Tb4b4b4{
Te6edf3PMU Tff7b72= Te6edf3new Te6edf3XPowersAXP192Tb4b4b4(Te6edf3PMU_WIRE_PORTTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTff7b72-Tff7b72>Te6edf3initTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3delete Te6edf3PMUTb4b4b4;
Te6edf3PMU Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}

T8b949e// Configure charging indicator
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setChargingLedModeTb4b4b4(Te6edf3XPOWERS_CHG_LED_OFFTb4b4b4)Tb4b4b4;

Te6edf3pinModeTb4b4b4(Te6edf3PMU_IRQTb4b4b4, Te6edf3INPUT_PULLUPTb4b4b4)Tb4b4b4;
Te6edf3attachInterruptTb4b4b4(Te6edf3PMU_IRQTb4b4b4, Te6edf3setPmuFlagTb4b4b4, Te6edf3FALLINGTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3PMUTff7b72-Tff7b72>Te6edf3getChipModelTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3XPOWERS_AXP192Tb4b4b4) Tb4b4b4{

T8b949e// Turn off unused power sources to save power
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC1Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC2Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_LDO2Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_LDO3Tb4b4b4)Tb4b4b4;

T8b949e// Set the power of LoRa and GPS module to 3.3V
T8b949e// LoRa
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_LDO2Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
T8b949e// GPS
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_LDO3Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
T8b949e// OLED
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_DCDC1Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;

T8b949e// Turn on LoRa
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_LDO2Tb4b4b4)Tb4b4b4;

T8b949e// Turn on GPS
T8b949e//PMU->enablePowerOutput(XPOWERS_LDO3);

T8b949e// protected oled power source
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setProtectedChannelTb4b4b4(Te6edf3XPOWERS_DCDC1Tb4b4b4)Tb4b4b4;
T8b949e// protected esp32 power source
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setProtectedChannelTb4b4b4(Te6edf3XPOWERS_DCDC3Tb4b4b4)Tb4b4b4;
T8b949e// enable oled power
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC1Tb4b4b4)Tb4b4b4;

Te6edf3PMUTff7b72-Tff7b72>Te6edf3disableIRQTb4b4b4(Te6edf3XPOWERS_AXP192_ALL_IRQTb4b4b4)Tb4b4b4;

Te6edf3PMUTff7b72-Tff7b72>Te6edf3enableIRQTb4b4b4(Te6edf3XPOWERS_AXP192_VBUS_REMOVE_IRQ Tff7b72|
Te6edf3XPOWERS_AXP192_VBUS_INSERT_IRQ Tff7b72|
Te6edf3XPOWERS_AXP192_BAT_CHG_DONE_IRQ Tff7b72|
Te6edf3XPOWERS_AXP192_BAT_CHG_START_IRQ Tff7b72|
Te6edf3XPOWERS_AXP192_BAT_REMOVE_IRQ Tff7b72|
Te6edf3XPOWERS_AXP192_BAT_INSERT_IRQ Tff7b72|
Te6edf3XPOWERS_AXP192_PKEY_SHORT_IRQ
Tb4b4b4)Tb4b4b4;

Tb4b4b4}
Tff7b72else Tff7b72if Tb4b4b4(Te6edf3PMUTff7b72-Tff7b72>Te6edf3getChipModelTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3XPOWERS_AXP2101Tb4b4b4) Tb4b4b4{

T8b949e// Turn off unused power sources to save power
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC2Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC3Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC4Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC5Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO1Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO2Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO3Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO4Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_BLDO1Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_BLDO2Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DLDO1Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DLDO2Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_VBACKUPTb4b4b4)Tb4b4b4;

T8b949e// Set the power of LoRa and GPS module to 3.3V
T8b949e// LoRa
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_ALDO2Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
T8b949e// GPS
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_ALDO3Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_VBACKUPTb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;

T8b949e// ESP32 VDD
T8b949e// ! No need to set, automatically open , Don't close it
T8b949e// PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300);
T8b949e// PMU->setProtectedChannel(XPOWERS_DCDC1);
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setProtectedChannelTb4b4b4(Te6edf3XPOWERS_DCDC1Tb4b4b4)Tb4b4b4;

T8b949e// LoRa VDD
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO2Tb4b4b4)Tb4b4b4;

T8b949e// GNSS VDD
T8b949e//PMU->enablePowerOutput(XPOWERS_ALDO3);

T8b949e// GNSS RTC PowerVDD
T8b949e//PMU->enablePowerOutput(XPOWERS_VBACKUP);
Tb4b4b4}

Te6edf3PMUTff7b72-Tff7b72>Te6edf3enableSystemVoltageMeasureTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enableVbusVoltageMeasureTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enableBattVoltageMeasureTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// It is necessary to disable the detection function of the TS pin on the board
T8b949e// without the battery temperature detection function, otherwise it will cause abnormal charging
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disableTSPinMeasureTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// Set the time of pressing the button to turn off
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerKeyPressOffTimeTb4b4b4(Te6edf3XPOWERS_POWEROFF_4STb4b4b4)Tb4b4b4;

Tff7b72return Tffa657trueTb4b4b4;
Tff7b72#Tff7b72elif BOARD_MODEL == BOARD_TBEAM_S_V1
Te6edf3Wire1Tb4b4b4.Te6edf3beginTb4b4b4(Te6edf3I2C_SDATb4b4b4, Te6edf3I2C_SCLTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTb4b4b4) Tb4b4b4{
Te6edf3PMU Tff7b72= Te6edf3new Te6edf3XPowersAXP2101Tb4b4b4(Te6edf3PMU_WIRE_PORTTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTff7b72-Tff7b72>Te6edf3initTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3delete Te6edf3PMUTb4b4b4;
Te6edf3PMU Tff7b72= Tffa657NULLTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3PMUTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}

T8b949e/**
* gnss module power channel
* The default ALDO4 is off, you need to turn on the GNSS power first, otherwise it will be invalid during
* initialization
*/
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_ALDO4Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO4Tb4b4b4)Tb4b4b4;

T8b949e// lora radio power channel
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_ALDO3Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO3Tb4b4b4)Tb4b4b4;

T8b949e// m.2 interface
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_DCDC3Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC3Tb4b4b4)Tb4b4b4;

T8b949e/**
* ALDO2 cannot be turned off.
* It is a necessary condition for sensor communication.
* It must be turned on to properly access the sensor and screen
* It is also responsible for the power supply of PCF8563
*/
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_ALDO2Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO2Tb4b4b4)Tb4b4b4;

T8b949e// 6-axis , magnetometer ,bme280 , oled screen power channel
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_ALDO1Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_ALDO1Tb4b4b4)Tb4b4b4;

T8b949e// sdcard power channle
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerChannelVoltageTb4b4b4(Te6edf3XPOWERS_BLDO1Tb4b4b4, T79c0ff3300Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enablePowerOutputTb4b4b4(Te6edf3XPOWERS_BLDO1Tb4b4b4)Tb4b4b4;

T8b949e// PMU->setPowerChannelVoltage(XPOWERS_DCDC4, 3300);
T8b949e// PMU->enablePowerOutput(XPOWERS_DCDC4);

T8b949e// not use channel
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC2Tb4b4b4)Tb4b4b4; T8b949e// not elicited
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DCDC5Tb4b4b4)Tb4b4b4; T8b949e// not elicited
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DLDO1Tb4b4b4)Tb4b4b4; T8b949e// Invalid power channel, it does not exist
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_DLDO2Tb4b4b4)Tb4b4b4; T8b949e// Invalid power channel, it does not exist
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disablePowerOutputTb4b4b4(Te6edf3XPOWERS_VBACKUPTb4b4b4)Tb4b4b4;

T8b949e// Configure charging
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setChargeTargetVoltageTb4b4b4(Te6edf3XPOWERS_AXP2101_CHG_VOL_4V2Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setChargerConstantCurrTb4b4b4(Te6edf3XPOWERS_AXP2101_CHG_CUR_500MATb4b4b4)Tb4b4b4;
T8b949e// TODO: Reset
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setChargingLedModeTb4b4b4(Te6edf3XPOWERS_CHG_LED_CTRL_CHGTb4b4b4)Tb4b4b4;

T8b949e// Set the time of pressing the button to turn off
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerKeyPressOffTimeTb4b4b4(Te6edf3XPOWERS_POWEROFF_4STb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3setPowerKeyPressOnTimeTb4b4b4(Te6edf3XPOWERS_POWERON_128MSTb4b4b4)Tb4b4b4;

T8b949e// disable all axp chip interrupt
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disableIRQTb4b4b4(Te6edf3XPOWERS_AXP2101_ALL_IRQTb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3clearIrqStatusTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// It is necessary to disable the detection function of the TS pin on the board
T8b949e// without the battery temperature detection function, otherwise it will cause abnormal charging
Te6edf3PMUTff7b72-Tff7b72>Te6edf3disableTSPinMeasureTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enableVbusVoltageMeasureTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3PMUTff7b72-Tff7b72>Te6edf3enableBattVoltageMeasureTb4b4b4(Tb4b4b4)Tb4b4b4;


Tff7b72return Tffa657trueTb4b4b4;
Tff7b72#Tff7b72else
Tff7b72return Tffa657falseTb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────